using AutoMapper;
using B.S.NewMedical.Api.Write.Application.Command.ContentManagement.Patient;
using B.S.NewMedical.Domain.Hospital;
using B.S.NewMedical.Infrastructure.Interface;
using MediatR;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace B.S.NewMedical.Api.Write.Application.Handler.ContentManagement.Patient
{
    /// <summary>
    /// 更新患者命令处理器
    /// </summary>
    public class UpdatePatientCommandHandler : IRequestHandler<UpdatePatientCommand, bool>
    {
        private readonly IMapper _mapper;
        private readonly IBaseRepository<PatientModel> _patientRepository;

        public UpdatePatientCommandHandler(IMapper mapper, IBaseRepository<PatientModel> patientRepository)
        {
            _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
            _patientRepository = patientRepository ?? throw new ArgumentNullException(nameof(patientRepository));
        }

        /// <summary>
        /// 处理更新患者命令
        /// </summary>
        /// <param name="request">更新患者命令</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>是否更新成功</returns>
        public async Task<bool> Handle(UpdatePatientCommand request, CancellationToken cancellationToken)
        {
            // 查找要更新的患者
            var existingPatient = await _patientRepository.GetValue(request.Id);
            if (existingPatient == null || existingPatient.IsDeleted)
            {
                return false;
            }

            // 验证出生日期是否合理
            if (request.DateOfBirth > DateTime.Now)
            {
                throw new ArgumentException("出生日期不能晚于当前日期");
            }

            if (request.DateOfBirth < DateTime.Now.AddYears(-150))
            {
                throw new ArgumentException("出生日期不能早于150年前");
            }

            // 检查身份证号是否重复（排除自己）
            var duplicateIDCard = _patientRepository.GetAll()
                .Where(p => p.IDCard == request.IDCard && 
                           p.Id != request.Id && 
                           !p.IsDeleted)
                .FirstOrDefault();

            if (duplicateIDCard != null)
            {
                throw new ArgumentException($"身份证号 '{request.IDCard}' 已被其他患者使用");
            }

            // 检查联系方式是否重复（排除自己）
            var duplicateContact = _patientRepository.GetAll()
                .Where(p => p.ContactInfo == request.ContactInfo && 
                           p.Id != request.Id && 
                           !p.IsDeleted)
                .FirstOrDefault();

            if (duplicateContact != null)
            {
                throw new ArgumentException($"联系方式 '{request.ContactInfo}' 已被其他患者使用");
            }

            // 如果提供了AccountId，验证其是否有效
            if (request.AccountId.HasValue && request.AccountId.Value <= 0)
            {
                throw new ArgumentException("用户ID必须大于0");
            }

            // 使用 AutoMapper 将命令映射到现有实体
            _mapper.Map(request, existingPatient);

            // 设置更新时间
            existingPatient.UpdateTime = DateTime.Now;

            // 调用仓储层更新数据
            await _patientRepository.UpdateAsync(existingPatient);
            return true;
        }
    }
}